macos: use opaque GL context when possible
authorChristian Hergert <chergert@redhat.com>
Thu, 5 Nov 2020 21:34:29 +0000 (13:34 -0800)
committerChristian Hergert <chergert@redhat.com>
Thu, 5 Nov 2020 21:34:29 +0000 (13:34 -0800)
This is better for situations where the window is decorated and therefore we can
rely on window system clipping of rounded corners.

gdk/macos/gdkmacosglcontext.c
gdk/macos/gdkmacostoplevelsurface-private.h
gdk/macos/gdkmacostoplevelsurface.c

index d3c70e6f5b64242beeb463b7c2765843fe3e106f..e3d72e54d94c58c310e51ac6a9839e3c32f41969 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "gdkmacosglcontext-private.h"
 #include "gdkmacossurface-private.h"
+#include "gdkmacostoplevelsurface-private.h"
 
 #include "gdkinternals.h"
 #include "gdkintl.h"
@@ -174,7 +175,6 @@ gdk_macos_gl_context_real_realize (GdkGLContext  *context,
   GdkGLContext *shared_data;
   GdkGLContext *existing;
   GLint sync_to_framerate = 1;
-  GLint opaque = 0;
   GLint validate = 0;
   int major, minor;
 
@@ -225,7 +225,6 @@ gdk_macos_gl_context_real_realize (GdkGLContext  *context,
     }
 
   [gl_context setValues:&sync_to_framerate forParameter:NSOpenGLCPSwapInterval];
-  [gl_context setValues:&opaque forParameter:NSOpenGLCPSurfaceOpacity];
   [gl_context setValues:&validate forParameter:NSOpenGLContextParameterStateValidation];
 
   self->dummy_window = [[NSWindow alloc] initWithContentRect:NSZeroRect
@@ -280,6 +279,9 @@ gdk_macos_gl_context_begin_frame (GdkDrawContext *context,
 
   if (self->needs_resize)
     {
+      GdkSurface *surface = gdk_draw_context_get_surface (context);
+      GLint opaque;
+
       self->needs_resize = FALSE;
 
       if (self->dummy_view != NULL)
@@ -291,6 +293,16 @@ gdk_macos_gl_context_begin_frame (GdkDrawContext *context,
           [self->dummy_view setFrame:frame];
         }
 
+      /* Possibly update our opaque setting depending on a resize. We can
+       * rely on getting a resize if decoarated is changed, so this reduces
+       * how much we adjust the parameter.
+       */
+      if (GDK_IS_MACOS_TOPLEVEL_SURFACE (surface))
+        opaque = GDK_MACOS_TOPLEVEL_SURFACE (surface)->decorated;
+      else
+        opaque = FALSE;
+      [self->gl_context setValues:&opaque forParameter:NSOpenGLCPSurfaceOpacity];
+
       [self->gl_context update];
     }
 
index d7866601e5bc84cf9352b112bcb816e14edb3e75..8d3ec15b02130299398bba6b381b89bb96d515c5 100644 (file)
 
 G_BEGIN_DECLS
 
-typedef struct _GdkMacosToplevelSurface      GdkMacosToplevelSurface;
-typedef struct _GdkMacosToplevelSurfaceClass GdkMacosToplevelSurfaceClass;
-
 #define GDK_TYPE_MACOS_TOPLEVEL_SURFACE       (_gdk_macos_toplevel_surface_get_type())
 #define GDK_MACOS_TOPLEVEL_SURFACE(object)    (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_MACOS_TOPLEVEL_SURFACE, GdkMacosToplevelSurface))
 #define GDK_IS_MACOS_TOPLEVEL_SURFACE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_MACOS_TOPLEVEL_SURFACE))
 
+typedef struct _GdkMacosToplevelSurface      GdkMacosToplevelSurface;
+typedef struct _GdkMacosToplevelSurfaceClass GdkMacosToplevelSurfaceClass;
+
+struct _GdkMacosToplevelSurface
+{
+  GdkMacosSurface parent_instance;
+  guint           decorated : 1;
+};
+
+struct _GdkMacosToplevelSurfaceClass
+{
+  GdkMacosSurfaceClass parent_instance;
+};
+
 GType            _gdk_macos_toplevel_surface_get_type           (void);
 GdkMacosSurface *_gdk_macos_toplevel_surface_new                (GdkMacosDisplay *display,
                                                                  GdkSurface      *parent,
index 2615957b2cfd8521a80f94c59e9733c29db662b0..a9a648841958be89cf28506b6db566c9fcfe20ec 100644 (file)
 #include "gdkmacostoplevelsurface-private.h"
 #include "gdkmacosutils-private.h"
 
-struct _GdkMacosToplevelSurface
-{
-  GdkMacosSurface parent_instance;
-  guint           decorated : 1;
-};
-
-struct _GdkMacosToplevelSurfaceClass
-{
-  GdkMacosSurfaceClass parent_instance;
-};
-
 static void
 _gdk_macos_toplevel_surface_fullscreen (GdkMacosToplevelSurface *self)
 {